with Matiere.IO; use Matiere.IO;
with Ada.Text_IO; use Ada.Text_IO;
with My_String; use My_String;
with My_String.IO; use My_String.IO;

package body Diplome is

   procedure Enregistrer(Mon_Diplome : in out Type_Diplome) is
      Matiere : Type_Matiere;
      Nombre : Type_Nombre_Matieres;
   begin
      Matiere := Saisir_Matiere;
      if Mon_Diplome.Matieres.Nombre = 0 then
         Nombre := 1;
      else
         Nombre := Mon_Diplome.Matieres.Nombre +1;
      end if;

      Mon_Diplome.Matieres.Nombre := Nombre;
      Mon_Diplome.Matieres.Tab(Nombre) := Matiere;

   end Enregistrer;

   procedure Retirer(Mon_Diplome : in out Type_Diplome) is
      Intitule : Type_String;
   begin
      Afficher_Matieres(Mon_Diplome.Matieres);
      Intitule := My_String.IO.Get;
      Retirer_Matiere(Mon_Diplome.Matieres, Intitule);
   end Retirer;

   procedure Ponderer(Mon_Diplome : in out Type_Diplome) is
      Coef : Type_Coefficient;
      Intitule : Type_String;
      Index : Type_Nombre_Matieres;
   begin
      Afficher_Matieres(Mon_Diplome.Matieres);
      Put("Intitule :");
      Intitule := My_String.IO.Get;
      if Tester_Intitule(Mon_Diplome.Matieres, Intitule) then
         Put("Nouveau Coefficient :");
         Coef := Saisir_Coefficient;
         Index := Index_Intitule(Mon_Diplome.Matieres, Intitule);
         Mon_Diplome.Matieres.Tab(Index).Coefficient := Coef;
         Put_Line("Coefficient modifie");
      else
         Put_Line("Ce cours n'existe pas");
      end if;
   end Ponderer;

   procedure Viser(Mon_Diplome : in out Type_Diplome) is
   begin
      Put_Line("Moyenne a atteindre :");
      Mon_Diplome.Objectif := Saisir_Note_Valeur;
      Put_Line("Objectif modifie");
   end Viser;


   procedure Executer(Mon_Diplome : in out Type_Diplome; Fonctionnalite : Type_Fonctionnalites) is
      Intitule : Type_String;
      Index : Type_Nombre_Matieres;
   begin
      Afficher_Matieres(Mon_Diplome.Matieres);
      Put("Intitule :");
      Intitule := My_String.IO.Get;
      if Tester_Intitule(Mon_Diplome.Matieres, Intitule) then
         Index := Index_Intitule(Mon_Diplome.Matieres, Intitule);

         case Fonctionnalite is
            when Liberer =>
               Matiere.Liberer(Mon_Diplome.Matieres.Tab(Index));
            when Simuler =>
               Matiere.Simuler(Mon_Diplome.Matieres.Tab(Index));
            when Attribuer =>
               Matiere.Attribuer(Mon_Diplome.Matieres.Tab(Index));
            when Modifier =>
               Matiere.Modifier(Mon_Diplome.Matieres.Tab(Index));
            when others =>
               null;
         end case;

         Matiere.Liberer(Mon_Diplome.Matieres.Tab(Index));
      else
         Put_Line("Ce cours n'existe pas");
      end if;
   end Executer;

   procedure Lister(Mon_Diplome : in Type_Diplome) is
   begin
      Put_Line("Objectif :" & Afficher_Note_Valeur(Mon_Diplome.Objectif));
      Afficher_Matieres(Mon_Diplome.Matieres);
   end Lister;

   procedure Classer(Mon_Diplome : in out Type_Diplome) is
   begin
      null;
   end Classer;
end Diplome;